export {}
// 函数 + 原型 实现class
// ES6 class
// 访问修饰符 抽象类
class Person {
  // ES2016 ES7 = 初始值
  // 必须赋值
  public name: string = ''
  private age: number = 18
  protected readonly gender: boolean = true
  // 外部输入进来的就是constructor上面的形参
  constructor(name: string, age: number) {
    this.name = name
    // 直接this访问会报错 Person 不存在name属性 要明确声明属性
    this.age = age
  }
  sayHi(msg: string): void {
    console.log(`I am ${this.name}, ${msg}`)
  }
}
// 访问修饰符
// private私有属性只能内部访问
const tom = new Person('tom', 18)
console.log(tom.name)
// console.log(tom.age);
// 报错因为age是private
// public是默认的
// protected 受保护的 也不能外部访问 只允许咋子类中访问
// console.log(tom.gender);
class Student extends Person {
  private constructor(name: string, age: number) {
    super(name, age)
    console.log(this.gender)
  }
  static create(name: string, age: number) {
    return new Student(name, age)
  }
}
// 控制类成员的可访问级别
// private constructor不能被外部实例化了 也不能被继承 只能在内部new
const rose = Student.create('jack', 18)
// protected constructor不能被外部实例化了 能被继承 也可以在内部new

// readonly 只读
// readonly 在访问修饰符之后 初始化只能一次 而且初始化之后不允许修改
// tom,gender = false
// b不管是内部还是外部都不行
